import math

def wgs84_to_web_mercator(lon:float, lat:float) -> list[int,int]:
    """
    Discription:
    ----------
    将经纬度转换为 Web墨卡托坐标

    Parameters
    ----------
    :param lon[float]: 大地坐标经度
    :param lat[float]: 大地坐标纬度

    Returns
    -------
    list Web墨卡托坐标[x, y],list[float] Web 墨卡托坐标
    """
    x = lon * 20037508.34 / 180
    y = math.log(math.tan((90 + lat) * math.pi / 360)) / (math.pi / 180)
    y = y * 20037508.34 / 180
    return [x, y]

def web_mercator_to_tile_no( x, y, zoom):
    """
    Discription:
    ----------
    web墨卡托坐标 + zoom缩放层级，计算该坐标所在的瓦片行列号

    Parameters
    ----------
    :param x[float]: web墨卡托x坐标
    :param y[float]: web墨卡托y坐标
    :param zoom[int]: 缩放层级（1-20）

    Returns
    -------
    list 行列号[x, y],list[float] 瓦片所在的行列号
    """

    # 像素位置计算
    pixelX = (x + 20037508.342789244) / 40075016.68557849 * (256 * 2 ** zoom)
    pixelY = (20037508.342789244 - y) / 40075016.68557849 * (256 * 2 ** zoom)
    # 瓦片位置计算
    tileX = int(pixelX // 256)
    tileY = int(pixelY // 256)
    return [tileX, tileY]

if __name__ == "__main__":
    xy = wgs84_to_web_mercator(119.5, 35.5)
    tile_coord = web_mercator_to_tile_no(xy[0], xy[1], 18)
    print(xy, tile_coord)